1 /*
2 * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package java.net;
27
28 import java.io.InputStream;
29 import java.io.OutputStream;
30 import java.io.IOException;
31 import java.io.InterruptedIOException;
32 import java.nio.channels.SocketChannel;
33 import java.security.AccessController;
34 import java.security.PrivilegedExceptionAction;
35 import java.security.PrivilegedAction;
36
37 /**
38 * This class implements client sockets (also called just
39 * "sockets"). A socket is an endpoint for communication
40 * between two machines.
41 * <p>
42 * The actual work of the socket is performed by an instance of the
43 * <code>SocketImpl</code> class. An application, by changing
44 * the socket factory that creates the socket implementation,
45 * can configure itself to create sockets appropriate to the local
46 * firewall.
47 *
48 * @author unascribed
49 * @see java.net.Socket#setSocketImplFactory(java.net.SocketImplFactory)
50 * @see java.net.SocketImpl
51 * @see java.nio.channels.SocketChannel
52 * @since JDK1.0
53 */
54 public
55 class Socket implements java.io.Closeable {
56 /**
57 * Various states of this socket.
58 */
59 private boolean created = false;
60 private boolean bound = false;
61 private boolean connected = false;
62 private boolean closed = false;
63 private Object closeLock = new Object();
64 private boolean shutIn = false;
65 private boolean shutOut = false;
66
67 /**
68 * The implementation of this Socket.
69 */
70 SocketImpl impl;
71
72 /**
73 * Are we using an older SocketImpl?
74 */
75 private boolean oldImpl = false;
76
77 /**
78 * Creates an unconnected socket, with the
79 * system-default type of SocketImpl.
80 *
81 * @since JDK1.1
82 * @revised 1.4
83 */
84 public Socket() {
85 setImpl();
86 }
87
88 /**
89 * Creates an unconnected socket, specifying the type of proxy, if any,
90 * that should be used regardless of any other settings.
91 * <P>
92 * If there is a security manager, its <code>checkConnect</code> method
93 * is called with the proxy host address and port number
94 * as its arguments. This could result in a SecurityException.
95 * <P>
96 * Examples:
97 * <UL> <LI><code>Socket s = new Socket(Proxy.NO_PROXY);</code> will create
98 * a plain socket ignoring any other proxy configuration.</LI>
99 * <LI><code>Socket s = new Socket(new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("socks.mydom.com", 1080)));</code>
100 * will create a socket connecting through the specified SOCKS proxy
101 * server.</LI>
102 * </UL>
103 *
104 * @param proxy a {@link java.net.Proxy Proxy} object specifying what kind
105 * of proxying should be used.
106 * @throws IllegalArgumentException if the proxy is of an invalid type
107 * or <code>null</code>.
108 * @throws SecurityException if a security manager is present and
109 * permission to connect to the proxy is
110 * denied.
111 * @see java.net.ProxySelector
112 * @see java.net.Proxy
113 *
114 * @since 1.5
115 */
116 public Socket(Proxy proxy) {
117 // Create a copy of Proxy as a security measure
118 if (proxy == null) {
119 throw new IllegalArgumentException("Invalid Proxy");
120 }
121 Proxy p = proxy == Proxy.NO_PROXY ? Proxy.NO_PROXY : sun.net.ApplicationProxy.create(proxy);
122 if (p.type() == Proxy.Type.SOCKS) {
123 SecurityManager security = System.getSecurityManager();
124 InetSocketAddress epoint = (InetSocketAddress) p.address();
125 if (epoint.getAddress() != null) {
126 checkAddress (epoint.getAddress(), "Socket");
127 }
128 if (security != null) {
129 if (epoint.isUnresolved())
130 epoint = new InetSocketAddress(epoint.getHostName(), epoint.getPort());
131 if (epoint.isUnresolved())
132 security.checkConnect(epoint.getHostName(), epoint.getPort());
133 else
134 security.checkConnect(epoint.getAddress().getHostAddress(),
135 epoint.getPort());
136 }
137 impl = new SocksSocketImpl(p);
138 impl.setSocket(this);
139 } else {
140 if (p == Proxy.NO_PROXY) {
141 if (factory == null) {
142 impl = new PlainSocketImpl();
143 impl.setSocket(this);
144 } else
145 setImpl();
146 } else
147 throw new IllegalArgumentException("Invalid Proxy");
148 }
149 }
150
151 /**
152 * Creates an unconnected Socket with a user-specified
153 * SocketImpl.
154 * <P>
155 * @param impl an instance of a <B>SocketImpl</B>
156 * the subclass wishes to use on the Socket.
157 *
158 * @exception SocketException if there is an error in the underlying protocol,
159 * such as a TCP error.
160 * @since JDK1.1
161 */
162 protected Socket(SocketImpl impl) throws SocketException {
163 this.impl = impl;
164 if (impl != null) {
165 checkOldImpl();
166 this.impl.setSocket(this);
167 }
168 }
169
170 /**
171 * Creates a stream socket and connects it to the specified port
172 * number on the named host.
173 * <p>
174 * If the specified host is <tt>null</tt> it is the equivalent of
175 * specifying the address as <tt>{@link java.net.InetAddress#getByName InetAddress.getByName}(null)</tt>.
176 * In other words, it is equivalent to specifying an address of the
177 * loopback interface. </p>
178 * <p>
179 * If the application has specified a server socket factory, that
180 * factory's <code>createSocketImpl</code> method is called to create
181 * the actual socket implementation. Otherwise a "plain" socket is created.
182 * <p>
183 * If there is a security manager, its
184 * <code>checkConnect</code> method is called
185 * with the host address and <code>port</code>
186 * as its arguments. This could result in a SecurityException.
187 *
188 * @param host the host name, or <code>null</code> for the loopback address.
189 * @param port the port number.
190 *
191 * @exception UnknownHostException if the IP address of
192 * the host could not be determined.
193 *
194 * @exception IOException if an I/O error occurs when creating the socket.
195 * @exception SecurityException if a security manager exists and its
196 * <code>checkConnect</code> method doesn't allow the operation.
197 * @exception IllegalArgumentException if the port parameter is outside
198 * the specified range of valid port values, which is between
199 * 0 and 65535, inclusive.
200 * @see java.net.Socket#setSocketImplFactory(java.net.SocketImplFactory)
201 * @see java.net.SocketImpl
202 * @see java.net.SocketImplFactory#createSocketImpl()
203 * @see SecurityManager#checkConnect
204 */
205 public Socket(String host, int port)
206 throws UnknownHostException, IOException
207 {
208 this(host != null ? new InetSocketAddress(host, port) :
209 new InetSocketAddress(InetAddress.getByName(null), port),
210 (SocketAddress) null, true);
211 }
212
213 /**
214 * Creates a stream socket and connects it to the specified port
215 * number at the specified IP address.
216 * <p>
217 * If the application has specified a socket factory, that factory's
218 * <code>createSocketImpl</code> method is called to create the
219 * actual socket implementation. Otherwise a "plain" socket is created.
220 * <p>
221 * If there is a security manager, its
222 * <code>checkConnect</code> method is called
223 * with the host address and <code>port</code>
224 * as its arguments. This could result in a SecurityException.
225 *
226 * @param address the IP address.
227 * @param port the port number.
228 * @exception IOException if an I/O error occurs when creating the socket.
229 * @exception SecurityException if a security manager exists and its
230 * <code>checkConnect</code> method doesn't allow the operation.
231 * @exception IllegalArgumentException if the port parameter is outside
232 * the specified range of valid port values, which is between
233 * 0 and 65535, inclusive.
234 * @exception NullPointerException if <code>address</code> is null.
235 * @see java.net.Socket#setSocketImplFactory(java.net.SocketImplFactory)
236 * @see java.net.SocketImpl
237 * @see java.net.SocketImplFactory#createSocketImpl()
238 * @see SecurityManager#checkConnect
239 */
240 public Socket(InetAddress address, int port) throws IOException {
241 this(address != null ? new InetSocketAddress(address, port) : null,
242 (SocketAddress) null, true);
243 }
244
245 /**
246 * Creates a socket and connects it to the specified remote host on
247 * the specified remote port. The Socket will also bind() to the local
248 * address and port supplied.
249 * <p>
250 * If the specified host is <tt>null</tt> it is the equivalent of
251 * specifying the address as <tt>{@link java.net.InetAddress#getByName InetAddress.getByName}(null)</tt>.
252 * In other words, it is equivalent to specifying an address of the
253 * loopback interface. </p>
254 * <p>
255 * A local port number of <code>zero</code> will let the system pick up a
256 * free port in the <code>bind</code> operation.</p>
257 * <p>
258 * If there is a security manager, its
259 * <code>checkConnect</code> method is called
260 * with the host address and <code>port</code>
261 * as its arguments. This could result in a SecurityException.
262 *
263 * @param host the name of the remote host, or <code>null</code> for the loopback address.
264 * @param port the remote port
265 * @param localAddr the local address the socket is bound to, or
266 * <code>null</code> for the <code>anyLocal</code> address.
267 * @param localPort the local port the socket is bound to, or
268 * <code>zero</code> for a system selected free port.
269 * @exception IOException if an I/O error occurs when creating the socket.
270 * @exception SecurityException if a security manager exists and its
271 * <code>checkConnect</code> method doesn't allow the operation.
272 * @exception IllegalArgumentException if the port parameter or localPort
273 * parameter is outside the specified range of valid port values,
274 * which is between 0 and 65535, inclusive.
275 * @see SecurityManager#checkConnect
276 * @since JDK1.1
277 */
278 public Socket(String host, int port, InetAddress localAddr,
279 int localPort) throws IOException {
280 this(host != null ? new InetSocketAddress(host, port) :
281 new InetSocketAddress(InetAddress.getByName(null), port),
282 new InetSocketAddress(localAddr, localPort), true);
283 }
284
285 /**
286 * Creates a socket and connects it to the specified remote address on
287 * the specified remote port. The Socket will also bind() to the local
288 * address and port supplied.
289 * <p>
290 * If the specified local address is <tt>null</tt> it is the equivalent of
291 * specifying the address as the AnyLocal address (see <tt>{@link java.net.InetAddress#isAnyLocalAddress InetAddress.isAnyLocalAddress}()</tt>).
292 * <p>
293 * A local port number of <code>zero</code> will let the system pick up a
294 * free port in the <code>bind</code> operation.</p>
295 * <p>
296 * If there is a security manager, its
297 * <code>checkConnect</code> method is called
298 * with the host address and <code>port</code>
299 * as its arguments. This could result in a SecurityException.
300 *
301 * @param address the remote address
302 * @param port the remote port
303 * @param localAddr the local address the socket is bound to, or
304 * <code>null</code> for the <code>anyLocal</code> address.
305 * @param localPort the local port the socket is bound to or
306 * <code>zero</code> for a system selected free port.
307 * @exception IOException if an I/O error occurs when creating the socket.
308 * @exception SecurityException if a security manager exists and its
309 * <code>checkConnect</code> method doesn't allow the operation.
310 * @exception IllegalArgumentException if the port parameter or localPort
311 * parameter is outside the specified range of valid port values,
312 * which is between 0 and 65535, inclusive.
313 * @exception NullPointerException if <code>address</code> is null.
314 * @see SecurityManager#checkConnect
315 * @since JDK1.1
316 */
317 public Socket(InetAddress address, int port, InetAddress localAddr,
318 int localPort) throws IOException {
319 this(address != null ? new InetSocketAddress(address, port) : null,
320 new InetSocketAddress(localAddr, localPort), true);
321 }
322
323 /**
324 * Creates a stream socket and connects it to the specified port
325 * number on the named host.
326 * <p>
327 * If the specified host is <tt>null</tt> it is the equivalent of
328 * specifying the address as <tt>{@link java.net.InetAddress#getByName InetAddress.getByName}(null)</tt>.
329 * In other words, it is equivalent to specifying an address of the
330 * loopback interface. </p>
331 * <p>
332 * If the stream argument is <code>true</code>, this creates a
333 * stream socket. If the stream argument is <code>false</code>, it
334 * creates a datagram socket.
335 * <p>
336 * If the application has specified a server socket factory, that
337 * factory's <code>createSocketImpl</code> method is called to create
338 * the actual socket implementation. Otherwise a "plain" socket is created.
339 * <p>
340 * If there is a security manager, its
341 * <code>checkConnect</code> method is called
342 * with the host address and <code>port</code>
343 * as its arguments. This could result in a SecurityException.
344 * <p>
345 * If a UDP socket is used, TCP/IP related socket options will not apply.
346 *
347 * @param host the host name, or <code>null</code> for the loopback address.
348 * @param port the port number.
349 * @param stream a <code>boolean</code> indicating whether this is
350 * a stream socket or a datagram socket.
351 * @exception IOException if an I/O error occurs when creating the socket.
352 * @exception SecurityException if a security manager exists and its
353 * <code>checkConnect</code> method doesn't allow the operation.
354 * @exception IllegalArgumentException if the port parameter is outside
355 * the specified range of valid port values, which is between
356 * 0 and 65535, inclusive.
357 * @see java.net.Socket#setSocketImplFactory(java.net.SocketImplFactory)
358 * @see java.net.SocketImpl
359 * @see java.net.SocketImplFactory#createSocketImpl()
360 * @see SecurityManager#checkConnect
361 * @deprecated Use DatagramSocket instead for UDP transport.
362 */
363 @Deprecated
364 public Socket(String host, int port, boolean stream) throws IOException {
365 this(host != null ? new InetSocketAddress(host, port) :
366 new InetSocketAddress(InetAddress.getByName(null), port),
367 (SocketAddress) null, stream);
368 }
369
370 /**
371 * Creates a socket and connects it to the specified port number at
372 * the specified IP address.
373 * <p>
374 * If the stream argument is <code>true</code>, this creates a
375 * stream socket. If the stream argument is <code>false</code>, it
376 * creates a datagram socket.
377 * <p>
378 * If the application has specified a server socket factory, that
379 * factory's <code>createSocketImpl</code> method is called to create
380 * the actual socket implementation. Otherwise a "plain" socket is created.
381 *
382 * <p>If there is a security manager, its
383 * <code>checkConnect</code> method is called
384 * with <code>host.getHostAddress()</code> and <code>port</code>
385 * as its arguments. This could result in a SecurityException.
386 * <p>
387 * If UDP socket is used, TCP/IP related socket options will not apply.
388 *
389 * @param host the IP address.
390 * @param port the port number.
391 * @param stream if <code>true</code>, create a stream socket;
392 * otherwise, create a datagram socket.
393 * @exception IOException if an I/O error occurs when creating the socket.
394 * @exception SecurityException if a security manager exists and its
395 * <code>checkConnect</code> method doesn't allow the operation.
396 * @exception IllegalArgumentException if the port parameter is outside
397 * the specified range of valid port values, which is between
398 * 0 and 65535, inclusive.
399 * @exception NullPointerException if <code>host</code> is null.
400 * @see java.net.Socket#setSocketImplFactory(java.net.SocketImplFactory)
401 * @see java.net.SocketImpl
402 * @see java.net.SocketImplFactory#createSocketImpl()
403 * @see SecurityManager#checkConnect
404 * @deprecated Use DatagramSocket instead for UDP transport.
405 */
406 @Deprecated
407 public Socket(InetAddress host, int port, boolean stream) throws IOException {
408 this(host != null ? new InetSocketAddress(host, port) : null,
409 new InetSocketAddress(0), stream);
410 }
411
412 private Socket(SocketAddress address, SocketAddress localAddr,
413 boolean stream) throws IOException {
414 setImpl();
415
416 // backward compatibility
417 if (address == null)
418 throw new NullPointerException();
419
420 try {
421 createImpl(stream);
422 if (localAddr != null)
423 bind(localAddr);
424 if (address != null)
425 connect(address);
426 } catch (IOException e) {
427 close();
428 throw e;
429 }
430 }
431
432 /**
433 * Creates the socket implementation.
434 *
435 * @param stream a <code>boolean</code> value : <code>true</code> for a TCP socket,
436 * <code>false</code> for UDP.
437 * @throws IOException if creation fails
438 * @since 1.4
439 */
440 void createImpl(boolean stream) throws SocketException {
441 if (impl == null)
442 setImpl();
443 try {
444 impl.create(stream);
445 created = true;
446 } catch (IOException e) {
447 throw new SocketException(e.getMessage());
448 }
449 }
450
451 private void checkOldImpl() {
452 if (impl == null)
453 return;
454 // SocketImpl.connect() is a protected method, therefore we need to use
455 // getDeclaredMethod, therefore we need permission to access the member
456
457 oldImpl = AccessController.doPrivileged
458 (new PrivilegedAction<Boolean>() {
459 public Boolean run() {
460 Class[] cl = new Class[2];
461 cl[0] = SocketAddress.class;
462 cl[1] = Integer.TYPE;
463 Class clazz = impl.getClass();
464 while (true) {
465 try {
466 clazz.getDeclaredMethod("connect", cl);
467 return Boolean.FALSE;
468 } catch (NoSuchMethodException e) {
469 clazz = clazz.getSuperclass();
470 // java.net.SocketImpl class will always have this abstract method.
471 // If we have not found it by now in the hierarchy then it does not
472 // exist, we are an old style impl.
473 if (clazz.equals(java.net.SocketImpl.class)) {
474 return Boolean.TRUE;
475 }
476 }
477 }
478 }
479 });
480 }
481
482 /**
483 * Sets impl to the system-default type of SocketImpl.
484 * @since 1.4
485 */
486 void setImpl() {
487 if (factory != null) {
488 impl = factory.createSocketImpl();
489 checkOldImpl();
490 } else {
491 // No need to do a checkOldImpl() here, we know it's an up to date
492 // SocketImpl!
493 impl = new SocksSocketImpl();
494 }
495 if (impl != null)
496 impl.setSocket(this);
497 }
498
499
500 /**
501 * Get the <code>SocketImpl</code> attached to this socket, creating
502 * it if necessary.
503 *
504 * @return the <code>SocketImpl</code> attached to that ServerSocket.
505 * @throws SocketException if creation fails
506 * @since 1.4
507 */
508 SocketImpl getImpl() throws SocketException {
509 if (!created)
510 createImpl(true);
511 return impl;
512 }
513
514 /**
515 * Connects this socket to the server.
516 *
517 * @param endpoint the <code>SocketAddress</code>
518 * @throws IOException if an error occurs during the connection
519 * @throws java.nio.channels.IllegalBlockingModeException
520 * if this socket has an associated channel,
521 * and the channel is in non-blocking mode
522 * @throws IllegalArgumentException if endpoint is null or is a
523 * SocketAddress subclass not supported by this socket
524 * @since 1.4
525 * @spec JSR-51
526 */
527 public void connect(SocketAddress endpoint) throws IOException {
528 connect(endpoint, 0);
529 }
530
531 /**
532 * Connects this socket to the server with a specified timeout value.
533 * A timeout of zero is interpreted as an infinite timeout. The connection
534 * will then block until established or an error occurs.
535 *
536 * @param endpoint the <code>SocketAddress</code>
537 * @param timeout the timeout value to be used in milliseconds.
538 * @throws IOException if an error occurs during the connection
539 * @throws SocketTimeoutException if timeout expires before connecting
540 * @throws java.nio.channels.IllegalBlockingModeException
541 * if this socket has an associated channel,
542 * and the channel is in non-blocking mode
543 * @throws IllegalArgumentException if endpoint is null or is a
544 * SocketAddress subclass not supported by this socket
545 * @since 1.4
546 * @spec JSR-51
547 */
548 public void connect(SocketAddress endpoint, int timeout) throws IOException {
549 if (endpoint == null)
550 throw new IllegalArgumentException("connect: The address can't be null");
551
552 if (timeout < 0)
553 throw new IllegalArgumentException("connect: timeout can't be negative");
554
555 if (isClosed())
556 throw new SocketException("Socket is closed");
557
558 if (!oldImpl && isConnected())
559 throw new SocketException("already connected");
560
561 if (!(endpoint instanceof InetSocketAddress))
562 throw new IllegalArgumentException("Unsupported address type");
563
564 InetSocketAddress epoint = (InetSocketAddress) endpoint;
565 InetAddress addr = epoint.getAddress ();
566 int port = epoint.getPort();
567 checkAddress(addr, "connect");
568
569 SecurityManager security = System.getSecurityManager();
570 if (security != null) {
571 if (epoint.isUnresolved())
572 security.checkConnect(epoint.getHostName(), port);
573 else
574 security.checkConnect(addr.getHostAddress(), port);
575 }
576 if (!created)
577 createImpl(true);
578 if (!oldImpl)
579 impl.connect(epoint, timeout);
580 else if (timeout == 0) {
581 if (epoint.isUnresolved())
582 impl.connect(addr.getHostName(), port);
583 else
584 impl.connect(addr, port);
585 } else
586 throw new UnsupportedOperationException("SocketImpl.connect(addr, timeout)");
587 connected = true;
588 /*
589 * If the socket was not bound before the connect, it is now because
590 * the kernel will have picked an ephemeral port & a local address
591 */
592 bound = true;
593 }
594
595 /**
596 * Binds the socket to a local address.
597 * <P>
598 * If the address is <code>null</code>, then the system will pick up
599 * an ephemeral port and a valid local address to bind the socket.
600 *
601 * @param bindpoint the <code>SocketAddress</code> to bind to
602 * @throws IOException if the bind operation fails, or if the socket
603 * is already bound.
604 * @throws IllegalArgumentException if bindpoint is a
605 * SocketAddress subclass not supported by this socket
606 *
607 * @since 1.4
608 * @see #isBound
609 */
610 public void bind(SocketAddress bindpoint) throws IOException {
611 if (isClosed())
612 throw new SocketException("Socket is closed");
613 if (!oldImpl && isBound())
614 throw new SocketException("Already bound");
615
616 if (bindpoint != null && (!(bindpoint instanceof InetSocketAddress)))
617 throw new IllegalArgumentException("Unsupported address type");
618 InetSocketAddress epoint = (InetSocketAddress) bindpoint;
619 if (epoint != null && epoint.isUnresolved())
620 throw new SocketException("Unresolved address");
621 if (epoint == null) {
622 epoint = new InetSocketAddress(0);
623 }
624 InetAddress addr = epoint.getAddress();
625 int port = epoint.getPort();
626 checkAddress (addr, "bind");
627 getImpl().bind (addr, port);
628 bound = true;
629 }
630
631 private void checkAddress (InetAddress addr, String op) {
632 if (addr == null) {
633 return;
634 }
635 if (!(addr instanceof Inet4Address || addr instanceof Inet6Address)) {
636 throw new IllegalArgumentException(op + ": invalid address type");
637 }
638 }
639
640 /**
641 * set the flags after an accept() call.
642 */
643 final void postAccept() {
644 connected = true;
645 created = true;
646 bound = true;
647 }
648
649 void setCreated() {
650 created = true;
651 }
652
653 void setBound() {
654 bound = true;
655 }
656
657 void setConnected() {
658 connected = true;
659 }
660
661 /**
662 * Returns the address to which the socket is connected.
663 * <p>
664 * If the socket was connected prior to being {@link #close closed},
665 * then this method will continue to return the connected address
666 * after the socket is closed.
667 *
668 * @return the remote IP address to which this socket is connected,
669 * or <code>null</code> if the socket is not connected.
670 */
671 public InetAddress getInetAddress() {
672 if (!isConnected())
673 return null;
674 try {
675 return getImpl().getInetAddress();
676 } catch (SocketException e) {
677 }
678 return null;
679 }
680
681 /**
682 * Gets the local address to which the socket is bound.
683 *
684 * @return the local address to which the socket is bound, or
685 * the {@link InetAddress#isAnyLocalAddress wildcard} address
686 * if the socket is closed or not bound yet.
687 * @since JDK1.1
688 */
689 public InetAddress getLocalAddress() {
690 // This is for backward compatibility
691 if (!isBound())
692 return InetAddress.anyLocalAddress();
693 InetAddress in = null;
694 try {
695 in = (InetAddress) getImpl().getOption(SocketOptions.SO_BINDADDR);
696 if (in.isAnyLocalAddress()) {
697 in = InetAddress.anyLocalAddress();
698 }
699 } catch (Exception e) {
700 in = InetAddress.anyLocalAddress(); // "0.0.0.0"
701 }
702 return in;
703 }
704
705 /**
706 * Returns the remote port number to which this socket is connected.
707 * <p>
708 * If the socket was connected prior to being {@link #close closed},
709 * then this method will continue to return the connected port number
710 * after the socket is closed.
711 *
712 * @return the remote port number to which this socket is connected, or
713 * 0 if the socket is not connected yet.
714 */
715 public int getPort() {
716 if (!isConnected())
717 return 0;
718 try {
719 return getImpl().getPort();
720 } catch (SocketException e) {
721 // Shouldn't happen as we're connected
722 }
723 return -1;
724 }
725
726 /**
727 * Returns the local port number to which this socket is bound.
728 * <p>
729 * If the socket was bound prior to being {@link #close closed},
730 * then this method will continue to return the local port number
731 * after the socket is closed.
732 *
733 * @return the local port number to which this socket is bound or -1
734 * if the socket is not bound yet.
735 */
736 public int getLocalPort() {
737 if (!isBound())
738 return -1;
739 try {
740 return getImpl().getLocalPort();
741 } catch(SocketException e) {
742 // shouldn't happen as we're bound
743 }
744 return -1;
745 }
746
747 /**
748 * Returns the address of the endpoint this socket is connected to, or
749 * <code>null</code> if it is unconnected.
750 * <p>
751 * If the socket was connected prior to being {@link #close closed},
752 * then this method will continue to return the connected address
753 * after the socket is closed.
754 *
755
756 * @return a <code>SocketAddress</code> representing the remote endpoint of this
757 * socket, or <code>null</code> if it is not connected yet.
758 * @see #getInetAddress()
759 * @see #getPort()
760 * @see #connect(SocketAddress, int)
761 * @see #connect(SocketAddress)
762 * @since 1.4
763 */
764 public SocketAddress getRemoteSocketAddress() {
765 if (!isConnected())
766 return null;
767 return new InetSocketAddress(getInetAddress(), getPort());
768 }
769
770 /**
771 * Returns the address of the endpoint this socket is bound to, or
772 * <code>null</code> if it is not bound yet.
773 * <p>
774 * If a socket bound to an endpoint represented by an
775 * <code>InetSocketAddress </code> is {@link #close closed},
776 * then this method will continue to return an <code>InetSocketAddress</code>
777 * after the socket is closed. In that case the returned
778 * <code>InetSocketAddress</code>'s address is the
779 * {@link InetAddress#isAnyLocalAddress wildcard} address
780 * and its port is the local port that it was bound to.
781 *
782 * @return a <code>SocketAddress</code> representing the local endpoint of this
783 * socket, or <code>null</code> if it is not bound yet.
784 * @see #getLocalAddress()
785 * @see #getLocalPort()
786 * @see #bind(SocketAddress)
787 * @since 1.4
788 */
789
790 public SocketAddress getLocalSocketAddress() {
791 if (!isBound())
792 return null;
793 return new InetSocketAddress(getLocalAddress(), getLocalPort());
794 }
795
796 /**
797 * Returns the unique {@link java.nio.channels.SocketChannel SocketChannel}
798 * object associated with this socket, if any.
799 *
800 * <p> A socket will have a channel if, and only if, the channel itself was
801 * created via the {@link java.nio.channels.SocketChannel#open
802 * SocketChannel.open} or {@link
803 * java.nio.channels.ServerSocketChannel#accept ServerSocketChannel.accept}
804 * methods.
805 *
806 * @return the socket channel associated with this socket,
807 * or <tt>null</tt> if this socket was not created
808 * for a channel
809 *
810 * @since 1.4
811 * @spec JSR-51
812 */
813 public SocketChannel getChannel() {
814 return null;
815 }
816
817 /**
818 * Returns an input stream for this socket.
819 *
820 * <p> If this socket has an associated channel then the resulting input
821 * stream delegates all of its operations to the channel. If the channel
822 * is in non-blocking mode then the input stream's <tt>read</tt> operations
823 * will throw an {@link java.nio.channels.IllegalBlockingModeException}.
824 *
825 * <p>Under abnormal conditions the underlying connection may be
826 * broken by the remote host or the network software (for example
827 * a connection reset in the case of TCP connections). When a
828 * broken connection is detected by the network software the
829 * following applies to the returned input stream :-
830 *
831 * <ul>
832 *
833 * <li><p>The network software may discard bytes that are buffered
834 * by the socket. Bytes that aren't discarded by the network
835 * software can be read using {@link java.io.InputStream#read read}.
836 *
837 * <li><p>If there are no bytes buffered on the socket, or all
838 * buffered bytes have been consumed by
839 * {@link java.io.InputStream#read read}, then all subsequent
840 * calls to {@link java.io.InputStream#read read} will throw an
841 * {@link java.io.IOException IOException}.
842 *
843 * <li><p>If there are no bytes buffered on the socket, and the
844 * socket has not been closed using {@link #close close}, then
845 * {@link java.io.InputStream#available available} will
846 * return <code>0</code>.
847 *
848 * </ul>
849 *
850 * <p> Closing the returned {@link java.io.InputStream InputStream}
851 * will close the associated socket.
852 *
853 * @return an input stream for reading bytes from this socket.
854 * @exception IOException if an I/O error occurs when creating the
855 * input stream, the socket is closed, the socket is
856 * not connected, or the socket input has been shutdown
857 * using {@link #shutdownInput()}
858 *
859 * @revised 1.4
860 * @spec JSR-51
861 */
862 public InputStream getInputStream() throws IOException {
863 if (isClosed())
864 throw new SocketException("Socket is closed");
865 if (!isConnected())
866 throw new SocketException("Socket is not connected");
867 if (isInputShutdown())
868 throw new SocketException("Socket input is shutdown");
869 final Socket s = this;
870 InputStream is = null;
871 try {
872 is = AccessController.doPrivileged(
873 new PrivilegedExceptionAction<InputStream>() {
874 public InputStream run() throws IOException {
875 return impl.getInputStream();
876 }
877 });
878 } catch (java.security.PrivilegedActionException e) {
879 throw (IOException) e.getException();
880 }
881 return is;
882 }
883
884 /**
885 * Returns an output stream for this socket.
886 *
887 * <p> If this socket has an associated channel then the resulting output
888 * stream delegates all of its operations to the channel. If the channel
889 * is in non-blocking mode then the output stream's <tt>write</tt>
890 * operations will throw an {@link
891 * java.nio.channels.IllegalBlockingModeException}.
892 *
893 * <p> Closing the returned {@link java.io.OutputStream OutputStream}
894 * will close the associated socket.
895 *
896 * @return an output stream for writing bytes to this socket.
897 * @exception IOException if an I/O error occurs when creating the
898 * output stream or if the socket is not connected.
899 * @revised 1.4
900 * @spec JSR-51
901 */
902 public OutputStream getOutputStream() throws IOException {
903 if (isClosed())
904 throw new SocketException("Socket is closed");
905 if (!isConnected())
906 throw new SocketException("Socket is not connected");
907 if (isOutputShutdown())
908 throw new SocketException("Socket output is shutdown");
909 final Socket s = this;
910 OutputStream os = null;
911 try {
912 os = AccessController.doPrivileged(
913 new PrivilegedExceptionAction<OutputStream>() {
914 public OutputStream run() throws IOException {
915 return impl.getOutputStream();
916 }
917 });
918 } catch (java.security.PrivilegedActionException e) {
919 throw (IOException) e.getException();
920 }
921 return os;
922 }
923
924 /**
925 * Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm).
926 *
927 * @param on <code>true</code> to enable TCP_NODELAY,
928 * <code>false</code> to disable.
929 *
930 * @exception SocketException if there is an error
931 * in the underlying protocol, such as a TCP error.
932 *
933 * @since JDK1.1
934 *
935 * @see #getTcpNoDelay()
936 */
937 public void setTcpNoDelay(boolean on) throws SocketException {
938 if (isClosed())
939 throw new SocketException("Socket is closed");
940 getImpl().setOption(SocketOptions.TCP_NODELAY, Boolean.valueOf(on));
941 }
942
943 /**
944 * Tests if TCP_NODELAY is enabled.
945 *
946 * @return a <code>boolean</code> indicating whether or not TCP_NODELAY is enabled.
947 * @exception SocketException if there is an error
948 * in the underlying protocol, such as a TCP error.
949 * @since JDK1.1
950 * @see #setTcpNoDelay(boolean)
951 */
952 public boolean getTcpNoDelay() throws SocketException {
953 if (isClosed())
954 throw new SocketException("Socket is closed");
955 return ((Boolean) getImpl().getOption(SocketOptions.TCP_NODELAY)).booleanValue();
956 }
957
958 /**
959 * Enable/disable SO_LINGER with the specified linger time in seconds.
960 * The maximum timeout value is platform specific.
961 *
962 * The setting only affects socket close.
963 *
964 * @param on whether or not to linger on.
965 * @param linger how long to linger for, if on is true.
966 * @exception SocketException if there is an error
967 * in the underlying protocol, such as a TCP error.
968 * @exception IllegalArgumentException if the linger value is negative.
969 * @since JDK1.1
970 * @see #getSoLinger()
971 */
972 public void setSoLinger(boolean on, int linger) throws SocketException {
973 if (isClosed())
974 throw new SocketException("Socket is closed");
975 if (!on) {
976 getImpl().setOption(SocketOptions.SO_LINGER, new Boolean(on));
977 } else {
978 if (linger < 0) {
979 throw new IllegalArgumentException("invalid value for SO_LINGER");
980 }
981 if (linger > 65535)
982 linger = 65535;
983 getImpl().setOption(SocketOptions.SO_LINGER, new Integer(linger));
984 }
985 }
986
987 /**
988 * Returns setting for SO_LINGER. -1 returns implies that the
989 * option is disabled.
990 *
991 * The setting only affects socket close.
992 *
993 * @return the setting for SO_LINGER.
994 * @exception SocketException if there is an error
995 * in the underlying protocol, such as a TCP error.
996 * @since JDK1.1
997 * @see #setSoLinger(boolean, int)
998 */
999 public int getSoLinger() throws SocketException {
1000 if (isClosed())
1001 throw new SocketException("Socket is closed");
1002 Object o = getImpl().getOption(SocketOptions.SO_LINGER);
1003 if (o instanceof Integer) {
1004 return ((Integer) o).intValue();
1005 } else {
1006 return -1;
1007 }
1008 }
1009
1010 /**
1011 * Send one byte of urgent data on the socket. The byte to be sent is the lowest eight
1012 * bits of the data parameter. The urgent byte is
1013 * sent after any preceding writes to the socket OutputStream
1014 * and before any future writes to the OutputStream.
1015 * @param data The byte of data to send
1016 * @exception IOException if there is an error
1017 * sending the data.
1018 * @since 1.4
1019 */
1020 public void sendUrgentData (int data) throws IOException {
1021 if (!getImpl().supportsUrgentData ()) {
1022 throw new SocketException ("Urgent data not supported");
1023 }
1024 getImpl().sendUrgentData (data);
1025 }
1026
1027 /**
1028 * Enable/disable OOBINLINE (receipt of TCP urgent data)
1029 *
1030 * By default, this option is disabled and TCP urgent data received on a
1031 * socket is silently discarded. If the user wishes to receive urgent data, then
1032 * this option must be enabled. When enabled, urgent data is received
1033 * inline with normal data.
1034 * <p>
1035 * Note, only limited support is provided for handling incoming urgent
1036 * data. In particular, no notification of incoming urgent data is provided
1037 * and there is no capability to distinguish between normal data and urgent
1038 * data unless provided by a higher level protocol.
1039 *
1040 * @param on <code>true</code> to enable OOBINLINE,
1041 * <code>false</code> to disable.
1042 *
1043 * @exception SocketException if there is an error
1044 * in the underlying protocol, such as a TCP error.
1045 *
1046 * @since 1.4
1047 *
1048 * @see #getOOBInline()
1049 */
1050 public void setOOBInline(boolean on) throws SocketException {
1051 if (isClosed())
1052 throw new SocketException("Socket is closed");
1053 getImpl().setOption(SocketOptions.SO_OOBINLINE, Boolean.valueOf(on));
1054 }
1055
1056 /**
1057 * Tests if OOBINLINE is enabled.
1058 *
1059 * @return a <code>boolean</code> indicating whether or not OOBINLINE is enabled.
1060 * @exception SocketException if there is an error
1061 * in the underlying protocol, such as a TCP error.
1062 * @since 1.4
1063 * @see #setOOBInline(boolean)
1064 */
1065 public boolean getOOBInline() throws SocketException {
1066 if (isClosed())
1067 throw new SocketException("Socket is closed");
1068 return ((Boolean) getImpl().getOption(SocketOptions.SO_OOBINLINE)).booleanValue();
1069 }
1070
1071 /**
1072 * Enable/disable SO_TIMEOUT with the specified timeout, in
1073 * milliseconds. With this option set to a non-zero timeout,
1074 * a read() call on the InputStream associated with this Socket
1075 * will block for only this amount of time. If the timeout expires,
1076 * a <B>java.net.SocketTimeoutException</B> is raised, though the
1077 * Socket is still valid. The option <B>must</B> be enabled
1078 * prior to entering the blocking operation to have effect. The
1079 * timeout must be > 0.
1080 * A timeout of zero is interpreted as an infinite timeout.
1081 * @param timeout the specified timeout, in milliseconds.
1082 * @exception SocketException if there is an error
1083 * in the underlying protocol, such as a TCP error.
1084 * @since JDK 1.1
1085 * @see #getSoTimeout()
1086 */
1087 public synchronized void setSoTimeout(int timeout) throws SocketException {
1088 if (isClosed())
1089 throw new SocketException("Socket is closed");
1090 if (timeout < 0)
1091 throw new IllegalArgumentException("timeout can't be negative");
1092
1093 getImpl().setOption(SocketOptions.SO_TIMEOUT, new Integer(timeout));
1094 }
1095
1096 /**
1097 * Returns setting for SO_TIMEOUT. 0 returns implies that the
1098 * option is disabled (i.e., timeout of infinity).
1099 * @return the setting for SO_TIMEOUT
1100 * @exception SocketException if there is an error
1101 * in the underlying protocol, such as a TCP error.
1102 * @since JDK1.1
1103 * @see #setSoTimeout(int)
1104 */
1105 public synchronized int getSoTimeout() throws SocketException {
1106 if (isClosed())
1107 throw new SocketException("Socket is closed");
1108 Object o = getImpl().getOption(SocketOptions.SO_TIMEOUT);
1109 /* extra type safety */
1110 if (o instanceof Integer) {
1111 return ((Integer) o).intValue();
1112 } else {
1113 return 0;
1114 }
1115 }
1116
1117 /**
1118 * Sets the SO_SNDBUF option to the specified value for this
1119 * <tt>Socket</tt>. The SO_SNDBUF option is used by the platform's
1120 * networking code as a hint for the size to set
1121 * the underlying network I/O buffers.
1122 *
1123 * <p>Because SO_SNDBUF is a hint, applications that want to
1124 * verify what size the buffers were set to should call
1125 * {@link #getSendBufferSize()}.
1126 *
1127 * @exception SocketException if there is an error
1128 * in the underlying protocol, such as a TCP error.
1129 *
1130 * @param size the size to which to set the send buffer
1131 * size. This value must be greater than 0.
1132 *
1133 * @exception IllegalArgumentException if the
1134 * value is 0 or is negative.
1135 *
1136 * @see #getSendBufferSize()
1137 * @since 1.2
1138 */
1139 public synchronized void setSendBufferSize(int size)
1140 throws SocketException{
1141 if (!(size > 0)) {
1142 throw new IllegalArgumentException("negative send size");
1143 }
1144 if (isClosed())
1145 throw new SocketException("Socket is closed");
1146 getImpl().setOption(SocketOptions.SO_SNDBUF, new Integer(size));
1147 }
1148
1149 /**
1150 * Get value of the SO_SNDBUF option for this <tt>Socket</tt>,
1151 * that is the buffer size used by the platform
1152 * for output on this <tt>Socket</tt>.
1153 * @return the value of the SO_SNDBUF option for this <tt>Socket</tt>.
1154 *
1155 * @exception SocketException if there is an error
1156 * in the underlying protocol, such as a TCP error.
1157 *
1158 * @see #setSendBufferSize(int)
1159 * @since 1.2
1160 */
1161 public synchronized int getSendBufferSize() throws SocketException {
1162 if (isClosed())
1163 throw new SocketException("Socket is closed");
1164 int result = 0;
1165 Object o = getImpl().getOption(SocketOptions.SO_SNDBUF);
1166 if (o instanceof Integer) {
1167 result = ((Integer)o).intValue();
1168 }
1169 return result;
1170 }
1171
1172 /**
1173 * Sets the SO_RCVBUF option to the specified value for this
1174 * <tt>Socket</tt>. The SO_RCVBUF option is used by the platform's
1175 * networking code as a hint for the size to set
1176 * the underlying network I/O buffers.
1177 *
1178 * <p>Increasing the receive buffer size can increase the performance of
1179 * network I/O for high-volume connection, while decreasing it can
1180 * help reduce the backlog of incoming data.
1181 *
1182 * <p>Because SO_RCVBUF is a hint, applications that want to
1183 * verify what size the buffers were set to should call
1184 * {@link #getReceiveBufferSize()}.
1185 *
1186 * <p>The value of SO_RCVBUF is also used to set the TCP receive window
1187 * that is advertized to the remote peer. Generally, the window size
1188 * can be modified at any time when a socket is connected. However, if
1189 * a receive window larger than 64K is required then this must be requested
1190 * <B>before</B> the socket is connected to the remote peer. There are two
1191 * cases to be aware of:<p>
1192 * <ol>
1193 * <li>For sockets accepted from a ServerSocket, this must be done by calling
1194 * {@link ServerSocket#setReceiveBufferSize(int)} before the ServerSocket
1195 * is bound to a local address.<p></li>
1196 * <li>For client sockets, setReceiveBufferSize() must be called before
1197 * connecting the socket to its remote peer.<p></li></ol>
1198 * @param size the size to which to set the receive buffer
1199 * size. This value must be greater than 0.
1200 *
1201 * @exception IllegalArgumentException if the value is 0 or is
1202 * negative.
1203 *
1204 * @exception SocketException if there is an error
1205 * in the underlying protocol, such as a TCP error.
1206 *
1207 * @see #getReceiveBufferSize()
1208 * @see ServerSocket#setReceiveBufferSize(int)
1209 * @since 1.2
1210 */
1211 public synchronized void setReceiveBufferSize(int size)
1212 throws SocketException{
1213 if (size <= 0) {
1214 throw new IllegalArgumentException("invalid receive size");
1215 }
1216 if (isClosed())
1217 throw new SocketException("Socket is closed");
1218 getImpl().setOption(SocketOptions.SO_RCVBUF, new Integer(size));
1219 }
1220
1221 /**
1222 * Gets the value of the SO_RCVBUF option for this <tt>Socket</tt>,
1223 * that is the buffer size used by the platform for
1224 * input on this <tt>Socket</tt>.
1225 *
1226 * @return the value of the SO_RCVBUF option for this <tt>Socket</tt>.
1227 * @exception SocketException if there is an error
1228 * in the underlying protocol, such as a TCP error.
1229 * @see #setReceiveBufferSize(int)
1230 * @since 1.2
1231 */
1232 public synchronized int getReceiveBufferSize()
1233 throws SocketException{
1234 if (isClosed())
1235 throw new SocketException("Socket is closed");
1236 int result = 0;
1237 Object o = getImpl().getOption(SocketOptions.SO_RCVBUF);
1238 if (o instanceof Integer) {
1239 result = ((Integer)o).intValue();
1240 }
1241 return result;
1242 }
1243
1244 /**
1245 * Enable/disable SO_KEEPALIVE.
1246 *
1247 * @param on whether or not to have socket keep alive turned on.
1248 * @exception SocketException if there is an error
1249 * in the underlying protocol, such as a TCP error.
1250 * @since 1.3
1251 * @see #getKeepAlive()
1252 */
1253 public void setKeepAlive(boolean on) throws SocketException {
1254 if (isClosed())
1255 throw new SocketException("Socket is closed");
1256 getImpl().setOption(SocketOptions.SO_KEEPALIVE, Boolean.valueOf(on));
1257 }
1258
1259 /**
1260 * Tests if SO_KEEPALIVE is enabled.
1261 *
1262 * @return a <code>boolean</code> indicating whether or not SO_KEEPALIVE is enabled.
1263 * @exception SocketException if there is an error
1264 * in the underlying protocol, such as a TCP error.
1265 * @since 1.3
1266 * @see #setKeepAlive(boolean)
1267 */
1268 public boolean getKeepAlive() throws SocketException {
1269 if (isClosed())
1270 throw new SocketException("Socket is closed");
1271 return ((Boolean) getImpl().getOption(SocketOptions.SO_KEEPALIVE)).booleanValue();
1272 }
1273
1274 /**
1275 * Sets traffic class or type-of-service octet in the IP
1276 * header for packets sent from this Socket.
1277 * As the underlying network implementation may ignore this
1278 * value applications should consider it a hint.
1279 *
1280 * <P> The tc <B>must</B> be in the range <code> 0 <= tc <=
1281 * 255</code> or an IllegalArgumentException will be thrown.
1282 * <p>Notes:
1283 * <p>For Internet Protocol v4 the value consists of an
1284 * <code>integer</code>, the least significant 8 bits of which
1285 * represent the value of the TOS octet in IP packets sent by
1286 * the socket.
1287 * RFC 1349 defines the TOS values as follows:
1288 * <p>
1289 * <UL>
1290 * <LI><CODE>IPTOS_LOWCOST (0x02)</CODE></LI>
1291 * <LI><CODE>IPTOS_RELIABILITY (0x04)</CODE></LI>
1292 * <LI><CODE>IPTOS_THROUGHPUT (0x08)</CODE></LI>
1293 * <LI><CODE>IPTOS_LOWDELAY (0x10)</CODE></LI>
1294 * </UL>
1295 * The last low order bit is always ignored as this
1296 * corresponds to the MBZ (must be zero) bit.
1297 * <p>
1298 * Setting bits in the precedence field may result in a
1299 * SocketException indicating that the operation is not
1300 * permitted.
1301 * <p>
1302 * As RFC 1122 section 4.2.4.2 indicates, a compliant TCP
1303 * implementation should, but is not required to, let application
1304 * change the TOS field during the lifetime of a connection.
1305 * So whether the type-of-service field can be changed after the
1306 * TCP connection has been established depends on the implementation
1307 * in the underlying platform. Applications should not assume that
1308 * they can change the TOS field after the connection.
1309 * <p>
1310 * For Internet Protocol v6 <code>tc</code> is the value that
1311 * would be placed into the sin6_flowinfo field of the IP header.
1312 *
1313 * @param tc an <code>int</code> value for the bitset.
1314 * @throws SocketException if there is an error setting the
1315 * traffic class or type-of-service
1316 * @since 1.4
1317 * @see #getTrafficClass
1318 */
1319 public void setTrafficClass(int tc) throws SocketException {
1320 if (tc < 0 || tc > 255)
1321 throw new IllegalArgumentException("tc is not in range 0 -- 255");
1322
1323 if (isClosed())
1324 throw new SocketException("Socket is closed");
1325 getImpl().setOption(SocketOptions.IP_TOS, new Integer(tc));
1326 }
1327
1328 /**
1329 * Gets traffic class or type-of-service in the IP header
1330 * for packets sent from this Socket
1331 * <p>
1332 * As the underlying network implementation may ignore the
1333 * traffic class or type-of-service set using {@link #setTrafficClass(int)}
1334 * this method may return a different value than was previously
1335 * set using the {@link #setTrafficClass(int)} method on this Socket.
1336 *
1337 * @return the traffic class or type-of-service already set
1338 * @throws SocketException if there is an error obtaining the
1339 * traffic class or type-of-service value.
1340 * @since 1.4
1341 * @see #setTrafficClass(int)
1342 */
1343 public int getTrafficClass() throws SocketException {
1344 return ((Integer) (getImpl().getOption(SocketOptions.IP_TOS))).intValue();
1345 }
1346
1347 /**
1348 * Enable/disable the SO_REUSEADDR socket option.
1349 * <p>
1350 * When a TCP connection is closed the connection may remain
1351 * in a timeout state for a period of time after the connection
1352 * is closed (typically known as the <tt>TIME_WAIT</tt> state
1353 * or <tt>2MSL</tt> wait state).
1354 * For applications using a well known socket address or port
1355 * it may not be possible to bind a socket to the required
1356 * <tt>SocketAddress</tt> if there is a connection in the
1357 * timeout state involving the socket address or port.
1358 * <p>
1359 * Enabling <tt>SO_REUSEADDR</tt> prior to binding the socket
1360 * using {@link #bind(SocketAddress)} allows the socket to be
1361 * bound even though a previous connection is in a timeout
1362 * state.
1363 * <p>
1364 * When a <tt>Socket</tt> is created the initial setting
1365 * of <tt>SO_REUSEADDR</tt> is disabled.
1366 * <p>
1367 * The behaviour when <tt>SO_REUSEADDR</tt> is enabled or
1368 * disabled after a socket is bound (See {@link #isBound()})
1369 * is not defined.
1370 *
1371 * @param on whether to enable or disable the socket option
1372 * @exception SocketException if an error occurs enabling or
1373 * disabling the <tt>SO_RESUEADDR</tt> socket option,
1374 * or the socket is closed.
1375 * @since 1.4
1376 * @see #getReuseAddress()
1377 * @see #bind(SocketAddress)
1378 * @see #isClosed()
1379 * @see #isBound()
1380 */
1381 public void setReuseAddress(boolean on) throws SocketException {
1382 if (isClosed())
1383 throw new SocketException("Socket is closed");
1384 getImpl().setOption(SocketOptions.SO_REUSEADDR, Boolean.valueOf(on));
1385 }
1386
1387 /**
1388 * Tests if SO_REUSEADDR is enabled.
1389 *
1390 * @return a <code>boolean</code> indicating whether or not SO_REUSEADDR is enabled.
1391 * @exception SocketException if there is an error
1392 * in the underlying protocol, such as a TCP error.
1393 * @since 1.4
1394 * @see #setReuseAddress(boolean)
1395 */
1396 public boolean getReuseAddress() throws SocketException {
1397 if (isClosed())
1398 throw new SocketException("Socket is closed");
1399 return ((Boolean) (getImpl().getOption(SocketOptions.SO_REUSEADDR))).booleanValue();
1400 }
1401
1402 /**
1403 * Closes this socket.
1404 * <p>
1405 * Any thread currently blocked in an I/O operation upon this socket
1406 * will throw a {@link SocketException}.
1407 * <p>
1408 * Once a socket has been closed, it is not available for further networking
1409 * use (i.e. can't be reconnected or rebound). A new socket needs to be
1410 * created.
1411 *
1412 * <p> Closing this socket will also close the socket's
1413 * {@link java.io.InputStream InputStream} and
1414 * {@link java.io.OutputStream OutputStream}.
1415 *
1416 * <p> If this socket has an associated channel then the channel is closed
1417 * as well.
1418 *
1419 * @exception IOException if an I/O error occurs when closing this socket.
1420 * @revised 1.4
1421 * @spec JSR-51
1422 * @see #isClosed
1423 */
1424 public synchronized void close() throws IOException {
1425 synchronized(closeLock) {
1426 if (isClosed())
1427 return;
1428 if (created)
1429 impl.close();
1430 closed = true;
1431 }
1432 }
1433
1434 /**
1435 * Places the input stream for this socket at "end of stream".
1436 * Any data sent to the input stream side of the socket is acknowledged
1437 * and then silently discarded.
1438 * <p>
1439 * If you read from a socket input stream after invoking
1440 * shutdownInput() on the socket, the stream will return EOF.
1441 *
1442 * @exception IOException if an I/O error occurs when shutting down this
1443 * socket.
1444 *
1445 * @since 1.3
1446 * @see java.net.Socket#shutdownOutput()
1447 * @see java.net.Socket#close()
1448 * @see java.net.Socket#setSoLinger(boolean, int)
1449 * @see #isInputShutdown
1450 */
1451 public void shutdownInput() throws IOException
1452 {
1453 if (isClosed())
1454 throw new SocketException("Socket is closed");
1455 if (!isConnected())
1456 throw new SocketException("Socket is not connected");
1457 if (isInputShutdown())
1458 throw new SocketException("Socket input is already shutdown");
1459 getImpl().shutdownInput();
1460 shutIn = true;
1461 }
1462
1463 /**
1464 * Disables the output stream for this socket.
1465 * For a TCP socket, any previously written data will be sent
1466 * followed by TCP's normal connection termination sequence.
1467 *
1468 * If you write to a socket output stream after invoking
1469 * shutdownOutput() on the socket, the stream will throw
1470 * an IOException.
1471 *
1472 * @exception IOException if an I/O error occurs when shutting down this
1473 * socket.
1474 *
1475 * @since 1.3
1476 * @see java.net.Socket#shutdownInput()
1477 * @see java.net.Socket#close()
1478 * @see java.net.Socket#setSoLinger(boolean, int)
1479 * @see #isOutputShutdown
1480 */
1481 public void shutdownOutput() throws IOException
1482 {
1483 if (isClosed())
1484 throw new SocketException("Socket is closed");
1485 if (!isConnected())
1486 throw new SocketException("Socket is not connected");
1487 if (isOutputShutdown())
1488 throw new SocketException("Socket output is already shutdown");
1489 getImpl().shutdownOutput();
1490 shutOut = true;
1491 }
1492
1493 /**
1494 * Converts this socket to a <code>String</code>.
1495 *
1496 * @return a string representation of this socket.
1497 */
1498 public String toString() {
1499 try {
1500 if (isConnected())
1501 return "Socket[addr=" + getImpl().getInetAddress() +
1502 ",port=" + getImpl().getPort() +
1503 ",localport=" + getImpl().getLocalPort() + "]";
1504 } catch (SocketException e) {
1505 }
1506 return "Socket[unconnected]";
1507 }
1508
1509 /**
1510 * Returns the connection state of the socket.
1511 * <p>
1512 * Note: Closing a socket doesn't clear its connection state, which means
1513 * this method will return <code>true</code> for a closed socket
1514 * (see {@link #isClosed()}) if it was successfuly connected prior
1515 * to being closed.
1516 *
1517 * @return true if the socket was successfuly connected to a server
1518 * @since 1.4
1519 */
1520 public boolean isConnected() {
1521 // Before 1.3 Sockets were always connected during creation
1522 return connected || oldImpl;
1523 }
1524
1525 /**
1526 * Returns the binding state of the socket.
1527 * <p>
1528 * Note: Closing a socket doesn't clear its binding state, which means
1529 * this method will return <code>true</code> for a closed socket
1530 * (see {@link #isClosed()}) if it was successfuly bound prior
1531 * to being closed.
1532 *
1533 * @return true if the socket was successfuly bound to an address
1534 * @since 1.4
1535 * @see #bind
1536 */
1537 public boolean isBound() {
1538 // Before 1.3 Sockets were always bound during creation
1539 return bound || oldImpl;
1540 }
1541
1542 /**
1543 * Returns the closed state of the socket.
1544 *
1545 * @return true if the socket has been closed
1546 * @since 1.4
1547 * @see #close
1548 */
1549 public boolean isClosed() {
1550 synchronized(closeLock) {
1551 return closed;
1552 }
1553 }
1554
1555 /**
1556 * Returns whether the read-half of the socket connection is closed.
1557 *
1558 * @return true if the input of the socket has been shutdown
1559 * @since 1.4
1560 * @see #shutdownInput
1561 */
1562 public boolean isInputShutdown() {
1563 return shutIn;
1564 }
1565
1566 /**
1567 * Returns whether the write-half of the socket connection is closed.
1568 *
1569 * @return true if the output of the socket has been shutdown
1570 * @since 1.4
1571 * @see #shutdownOutput
1572 */
1573 public boolean isOutputShutdown() {
1574 return shutOut;
1575 }
1576
1577 /**
1578 * The factory for all client sockets.
1579 */
1580 private static SocketImplFactory factory = null;
1581
1582 /**
1583 * Sets the client socket implementation factory for the
1584 * application. The factory can be specified only once.
1585 * <p>
1586 * When an application creates a new client socket, the socket
1587 * implementation factory's <code>createSocketImpl</code> method is
1588 * called to create the actual socket implementation.
1589 * <p>
1590 * Passing <code>null</code> to the method is a no-op unless the factory
1591 * was already set.
1592 * <p>If there is a security manager, this method first calls
1593 * the security manager's <code>checkSetFactory</code> method
1594 * to ensure the operation is allowed.
1595 * This could result in a SecurityException.
1596 *
1597 * @param fac the desired factory.
1598 * @exception IOException if an I/O error occurs when setting the
1599 * socket factory.
1600 * @exception SocketException if the factory is already defined.
1601 * @exception SecurityException if a security manager exists and its
1602 * <code>checkSetFactory</code> method doesn't allow the operation.
1603 * @see java.net.SocketImplFactory#createSocketImpl()
1604 * @see SecurityManager#checkSetFactory
1605 */
1606 public static synchronized void setSocketImplFactory(SocketImplFactory fac)
1607 throws IOException
1608 {
1609 if (factory != null) {
1610 throw new SocketException("factory already defined");
1611 }
1612 SecurityManager security = System.getSecurityManager();
1613 if (security != null) {
1614 security.checkSetFactory();
1615 }
1616 factory = fac;
1617 }
1618
1619 /**
1620 * Sets performance preferences for this socket.
1621 *
1622 * <p> Sockets use the TCP/IP protocol by default. Some implementations
1623 * may offer alternative protocols which have different performance
1624 * characteristics than TCP/IP. This method allows the application to
1625 * express its own preferences as to how these tradeoffs should be made
1626 * when the implementation chooses from the available protocols.
1627 *
1628 * <p> Performance preferences are described by three integers
1629 * whose values indicate the relative importance of short connection time,
1630 * low latency, and high bandwidth. The absolute values of the integers
1631 * are irrelevant; in order to choose a protocol the values are simply
1632 * compared, with larger values indicating stronger preferences. Negative
1633 * values represent a lower priority than positive values. If the
1634 * application prefers short connection time over both low latency and high
1635 * bandwidth, for example, then it could invoke this method with the values
1636 * <tt>(1, 0, 0)</tt>. If the application prefers high bandwidth above low
1637 * latency, and low latency above short connection time, then it could
1638 * invoke this method with the values <tt>(0, 1, 2)</tt>.
1639 *
1640 * <p> Invoking this method after this socket has been connected
1641 * will have no effect.
1642 *
1643 * @param connectionTime
1644 * An <tt>int</tt> expressing the relative importance of a short
1645 * connection time
1646 *
1647 * @param latency
1648 * An <tt>int</tt> expressing the relative importance of low
1649 * latency
1650 *
1651 * @param bandwidth
1652 * An <tt>int</tt> expressing the relative importance of high
1653 * bandwidth
1654 *
1655 * @since 1.5
1656 */
1657 public void setPerformancePreferences(int connectionTime,
1658 int latency,
1659 int bandwidth)
1660 {
1661 /* Not implemented yet */
1662 }
1663 }